package com.taskmanager.dao;

import com.taskmanager.entity.Task;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * 任务数据访问层
 */
@Mapper
public interface TaskDao {
    
    /**
     * 插入新任务
     * @param task 任务对象
     * @return 影响的行数
     */
    int insert(Task task);
    
    /**
     * 根据任务ID查询任务
     * @param taskId 任务ID
     * @return 任务对象
     */
    Task selectById(@Param("taskId") Long taskId);
    
    /**
     * 根据任务ID查询任务（包含分类信息）
     * @param taskId 任务ID
     * @return 任务对象（含分类信息）
     */
    Task selectByIdWithCategory(@Param("taskId") Long taskId);
    
    /**
     * 多条件查询任务列表
     * @param userId 用户ID
     * @param keyword 搜索关键词
     * @param status 状态
     * @param priority 优先级
     * @param categoryId 分类ID
     * @param sortBy 排序字段
     * @param sortOrder 排序方向
     * @return 任务列表
     */
    List<Task> selectByConditions(
            @Param("userId") Long userId,
            @Param("keyword") String keyword,
            @Param("status") String status,
            @Param("priority") String priority,
            @Param("categoryId") Long categoryId,
            @Param("sortBy") String sortBy,
            @Param("sortOrder") String sortOrder
    );
    
    /**
     * 查询即将到期的任务（指定天数内）
     * @param userId 用户ID
     * @param days 天数
     * @return 任务列表
     */
    List<Task> selectUpcomingTasks(@Param("userId") Long userId, @Param("days") int days);
    
    /**
     * 统计各状态任务数量
     * @param userId 用户ID
     * @return Map包含todoCount, inProgressCount, completedCount
     */
    java.util.Map<String, Object> countByStatus(@Param("userId") Long userId);
    
    /**
     * 更新任务
     * @param task 任务对象
     * @return 影响的行数
     */
    int update(Task task);
    
    /**
     * 更新任务状态
     * @param taskId 任务ID
     * @param status 新状态
     * @return 影响的行数
     */
    int updateStatus(@Param("taskId") Long taskId, @Param("status") String status);
    
    /**
     * 将指定分类的任务移动到另一个分类
     * @param fromCategoryId 源分类ID
     * @param toCategoryId 目标分类ID
     * @return 影响的行数
     */
    int updateCategoryBatch(@Param("fromCategoryId") Long fromCategoryId, 
                           @Param("toCategoryId") Long toCategoryId);
    
    /**
     * 删除任务
     * @param taskId 任务ID
     * @return 影响的行数
     */
    int deleteById(@Param("taskId") Long taskId);
    
    /**
     * 检查任务是否属于指定用户
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 是否属于该用户
     */
    boolean belongsToUser(@Param("taskId") Long taskId, @Param("userId") Long userId);
    
    /**
     * 更新任务的总计时时长
     * @param taskId 任务ID
     * @param totalTime 总时长（秒）
     * @return 影响的行数
     */
    int updateTotalTime(@Param("taskId") Long taskId, @Param("totalTime") Integer totalTime);
}
